﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Ext.Net;
using FastTravel.BusinessLogic;
using FastTravel.DB;
using FastTravel.DB.Enums;
using FastTravel.DB.Helpers;
using FastTravel.Utilites;

namespace FastTravel.IntranetWeb
{
	/// <summary>
	/// Страница управления пользователями системы
	/// </summary>
	public partial class UserList : BasePage
	{
		/// <summary>
		/// Загрузка страницы
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void Page_Load(object sender, EventArgs e)
		{
			if (!ExtNet.IsAjaxRequest)
			{
				// Заполняем хранилище пользователей

				Type type = typeof(UserRole);
				Dictionary<int, string> statusList = EnumMetadataConverter.GetListItems(type);

				var dropdawnList = new List<object>();

				foreach (var item in statusList)
				{
					dropdawnList.Add(new { Text = item.Value, Value = item.Key });
				}
				this.storeUserRole.DataSource = dropdawnList;
				this.storeUserRole.DataBind();
			}
		}

		/// <summary>
		/// Получение списка клиентов
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e">Параметры запроса</param>
		protected void StoreRefresh(object sender, StoreRefreshDataEventArgs e)
		{
			int totalCount = 0;

			var userList = UserManager.GetPage(e.Start, e.Limit, e.Sort, e.Dir.ToString(), false, out totalCount);

			e.Total = totalCount;

			this.grdUsers.GetStore().DataSource = userList;
		}


		/// <summary>
		/// События таблицы пользователей
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e">Аргумент с командами</param>
		public void GridAction(object sender, DirectEventArgs e)
		{
			int id = int.Parse(e.ExtraParams["id"]);
			switch (e.ExtraParams["command"])
			{
				case "Edit":
					ShowEdit(id);
					break;
				case "Delete":
					if (UserManager.HasOrder(id))
					{
						UserManager.Delete(id, false);
						if (BusinessLogicManager.TryCommit())
						{
							ExtNet.Msg.Notify("Сообщение", "Пользователь удален!").Show();
							grdUsers.Reload();
						}
						else
						{
							ExtNet.Msg.Notify("Ошибка", "Невозможно удалить пользователя!").Show();
						}
					}
					else
					{
						UserManager.Delete(id, true);
						if (BusinessLogicManager.TryCommit())
						{
							ExtNet.Msg.Notify("Сообщение", "Пользователь удален!").Show();
							grdUsers.Reload();
						}
						else
						{
							ExtNet.Msg.Notify("Ошибка", "Невозможно удалить пользователя!").Show();
						}
					}
					break;
			}

		}

		/// <summary>
		/// Открытие окна для добавления нового пользователя
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void BtnAddUserClick(object sender, DirectEventArgs e)
		{
			ClearNewUserForm();
			winUserNew.Show();
		}

		/// <summary>
		/// Очистка формы добавления нового пользователя
		/// </summary>
		protected void ClearNewUserForm()
		{
			txtLoginNew.Text = "";
			txtFirstNameNew.Text = "";
			txtLastNameNew.Text = "";
			txtMiddleNameNew.Text = "";
			txtLoginNew.Text = "";
			txtPasswordNew.Text = "";
			txtPasswordNewRepeat.Text = "";
			chkIsBlockedNew.Checked = false;
			comboUserRoleAdd.SelectedIndex = 0;
		}

		/// <summary>
		/// Очистка формы редактирования существующего пользователя
		/// </summary>
		protected void ClearEditUserForm()
		{
			txtLoginEdit.Text = "";
			txtFirstNameEdit.Text = "";
			txtLastNameEdit.Text = "";
			txtMiddleNameEdit.Text = "";
			txtPasswordEdit.Text = "";
			txtPasswordEditRepeat.Text = "";
			chkIsBlockedEdit.Checked = false;
			chkEnableNewPassword.Checked = false;
			comboUserRoleEdit.SelectedIndex = 0;
		}

		/// <summary>
		/// Добавление нового пользователя в БД
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void BtnConfirmNewUser(object sender, DirectEventArgs e)
		{
			if (UserManager.IsExsist(txtLoginNew.Text.Trim()))
			{
				ExtNet.Msg.Notify("Сообщение", "Пользователь с таким логином есть! Выберите другой!").Show();
				txtLoginNew.Text = "";
				txtLoginNew.Focus();
				
				return;
			}
			else
			{
				UserRole userRole = EnumMetadataConverter.NumToEnum<UserRole>(comboUserRoleAdd.SelectedIndex);

				string firstName = TextFormatHelper.FormatName(txtFirstNameNew.Text);
				string lastName = TextFormatHelper.FormatName(txtLastNameNew.Text);
				string middleName = TextFormatHelper.FormatName(txtMiddleNameNew.Text);

				UserManager.Add(txtLoginNew.Text.Trim(), txtPasswordNew.Text, userRole, firstName.Trim(), lastName.Trim(),
								middleName.Trim(), chkIsBlockedNew.Checked);
				if (BusinessLogicManager.TryCommit())
				{
					ExtNet.Msg.Notify("Сообщение", "Пользователь добавлен!").Show();
					winUserNew.Hide();
					grdUsers.Reload();
				}
				else
				{
					ExtNet.Msg.Notify("Ошибка", "Невозможно добавить пользователя!").Show();
				}
			}
			winUserNew.Hide();
		}

		/// <summary>
		/// Открытие окна для редактирования существующего пользователя
		/// </summary>
		/// <param name="userId"></param>
		protected void ShowEdit(int userId)
		{
			ClearEditUserForm();

			DB.User user = UserManager.Get(userId);
			if (user != null)
			{
				txtLoginEdit.Text = user.Login;
				txtFirstNameEdit.Text = user.FirstName;
				txtLastNameEdit.Text = user.LastName;
				txtMiddleNameEdit.Text = user.MiddleName;
				chkIsBlockedEdit.Checked = user.IsBlocked;
				comboUserRoleEdit.SelectedIndex = Array.IndexOf(Enum.GetValues(typeof(UserRole)), user.UserRole);
				Session["UserID"] = user.ID;
				Session["UserLogin"] = user.Login;
				winEditUser.Show();
			}
		}

		/// <summary>
		/// Сохранение редактирования данных о новом пользователе
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void BtnConfirmEditUser(object sender, DirectEventArgs e)
		{
			string oldLogin = (string) Session["UserLogin"];
			int userId = (int)Session["UserID"];

			string newLogin = txtLoginEdit.Text.Trim();

			if (newLogin == oldLogin)
			{
				// изменяем данные
				ChangeUserData(userId);
			}
			else
			{
				if (UserManager.IsExsist(newLogin))
				{
					ExtNet.Msg.Notify("Сообщение", "Пользователь с таким логином есть! Выберите другой!").Show();
					txtLoginEdit.SelectText();
					txtLoginEdit.Focus();
					return;
				}
				else
				{
					// изменяем данные
					ChangeUserData(userId);
				}
			}
			winEditUser.Hide();
		}

		/// <summary>
		/// Изменение данных о пользователе
		/// </summary>
		/// <param name="userId">ID пользователя</param>
		private void ChangeUserData(int userId)
		{
			UserRole userRole = EnumMetadataConverter.NumToEnum<UserRole>(comboUserRoleEdit.SelectedIndex);

			string login = txtLoginEdit.Text.Trim();
			string firstName = TextFormatHelper.FormatName(txtFirstNameEdit.Text);
			string lastName = TextFormatHelper.FormatName(txtLastNameEdit.Text);
			string middleName = TextFormatHelper.FormatName(txtMiddleNameEdit.Text);

			// учитываем чек-бокс "поменять пароль"
			if (!chkEnableNewPassword.Checked)
			{
				UserManager.Update(userId, login, userRole, firstName, lastName, middleName, chkIsBlockedEdit.Checked);
			}
			else
			{
				UserManager.Update(userId, login, txtPasswordEdit.Text, userRole, firstName, lastName, middleName, chkIsBlockedEdit.Checked);
			}

			if (BusinessLogicManager.TryCommit())
			{
				ExtNet.Msg.Notify("Сообщение", "Данные изменены!").Show();
				winEditUser.Hide();
				grdUsers.Reload();
			}
			else
			{
				ExtNet.Msg.Notify("Ошибка", "Невозможно изменить данные!").Show();
			}
		}
	}
}